package com.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class StrUtil {
	/**
	 * 判断字符串是不是空或null
	 * @param str 目标字符串
	 * @return 空或null返回true ,否则返回false
	 */
	public static boolean isNullOrEmpty(String str) {
		if(str==null || "".equals(str) ) {
			return true;
		}
		return false;
	}

	/**
	 * 格式化日期为字符串,如果为空,返回空串
	 * @param d 日期
	 * @return 格式化后的串
	 */
	public static String formatDate(Date d) {
		if(d==null) {
			return "";
		}
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
		return df.format(d);
	}
	
	/**
	 * 校验身份证号
	 * @param id 身分证号
	 * @return 错误信息
	 */
	public static String verifyIdCard(String id ) {
		
		//处理掉用户传过来的id为null的情况
		if(id==null){
			return "为null值";
		}
				
		//先解决掉非法字符的问题,前17位必须是数字,最后一位可以是x(这里指定大小写可)或数字,后面的验证就不用再考虑字符合法不合法的问题了
		if(!id.matches("\\d{17}[xX0-9]")){
			return "格式不正确"; 
		}


		//校验生日中年的部分
		int year=Integer.parseInt(id.substring(6,10));
		if(!(year>=1900 && year<=2011)){
			return "年份部分输入不正确";
		}
			
		//校验生日中月的部分
		int month=Integer.parseInt(id.substring(10,12));
		if(month<1||month>12){
			return "生日部分月份不正确";
		}
		
		//校验生日中日的部分
		int day=Integer.parseInt(id.substring(12,14));
		
		switch(month){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
				if(day<1||day>31){
					return "生日部分日期不正确";
				}
			break;
		case 2:
		
			//如果是润年
			if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ) {
				if(day<1||day>29){
					return "生日部分日期不正确";
				}
			}
			else{
				if(day<1||day>28){
					return "生日部分日期不正确";
				}
			}
			
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			if(day<1||day>30){
				return "生日部分日期不正确"; 
			}
			
			break;
		}
		
		
		//判断顺序码
		if(id.substring(14,17).equals("000") ){
			return "顺序码不正确";
		}
		
		//判断最后一位,校检码,x是最后一位校验码的值
		int x;
		String lastNum=id.substring(17,18);
		if(lastNum.toUpperCase().equals("X")){  
			x=10;
		}
		else{
			x=Integer.parseInt(id.substring(17,18));
		}
	
		
		long num=x;
		
		for(int i=17;i>0;i--){
			int n=Integer.parseInt( id.charAt(17-i)+"");  //前17位每一位数字
			num+=   n*Math.pow(2,i);  //a1*2^17+a2*2^16+a3*2^15....+a17*2^1
		}
		
		if(num%11!=1){
			return  "校验位校验失败"; 
		}
		
		//全部校验通过,顺序码最后一位如果为偶数,为女,奇数为男
		//return id.substring(16,17).equals("1")?"Male":"Female";
		
		return "";
	}
}
